#pragma once

#include "data.hpp"
#include <unistd.h>
extern cloud::DataManager* _data_manager;

namespace cloud
{
    class HotManager
    {
    public:
        HotManager()
        {
            Config *config = Config::GetInstance();

            _back_dir = config->GetBackDir();
            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _hot_time = config->GetHotTime();

            FileUtil tmp1(_back_dir);
            FileUtil tmp2(_pack_dir);

            //目录不存在就创建
            tmp1.CreateDirectory();
            tmp2.CreateDirectory();
        }

        bool RunModule()
        {
            while (true)
            {
                // 遍历备份目录，获取所有文件名
                FileUtil fu(_back_dir);
                std::vector<std::string> arry;
                fu.ScanDirectory(&arry);

                // 遍历判断文件是否为非热点文件
                for (auto &a : arry)
                {
                    // 热点文件不处理
                    if (HotJudge(a) == false)
                    {
                        continue;
                    }
                    // 获取文件的备份信息
                    BackupInfo binfo;
                    if (_data_manager->GetOneByRealpath(a, &binfo) == false)
                    {
                        // 说明有一个文件存在，但没有对应的备份信息
                        // 说明漏掉信息了
                        // 设置新的备份信息
                        binfo.NewBackupInfo(a);
                    }

                    // 对非热点进行压缩
                    FileUtil tmp(a);
                    tmp.compress(binfo.pack_path);

                    // 删除源文件
                    tmp.Remove();
                    binfo.pack_flag = true;

                    // 修改备份信息
                    _data_manager->Update(binfo);
                }

                //避免消耗过多cpu资源
                usleep(1000);
            }

            return true;
        }

    private:
        // 热点返回假的，非热点真
        bool HotJudge(const std::string &filename)
        {
            // 判断是否为热点文件
            FileUtil fu(filename);
            if (fu.Exists() == false)
            {
                std::cerr << "Hot Judge error" << std::endl;
                abort();
            }

            time_t last_atime = fu.LastATime();
            time_t cur_time = time(NULL);

            if (cur_time - last_atime > _hot_time)
            {
                // 非热点文件
                return true;
            }

            return false;
        }

    private:
        // 这个模块需要优化和扩展
        // conf
        std::string _back_dir;
        std::string _pack_dir;
        std::string _pack_suffix;
        int _hot_time;
        // DataManager* _data
    };
}

